Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V  < 1 2  
Reply to this topicStart new topic
> [php/MVC] Lancuszek akcji, akcja w akcji.
Ludvik
post
Post #21





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Google wyrzuca pierwszy wynik - Core J2EE Patterns. Przykład wykorzystania masz u mnie na blogu. Warto przeczytać właśnie Core J2EE Wzorce Projektowe i Patterns of Enterprise Application Architecture Fowlera (chociaż w tej drugiej nie ma tego wzorca, ale jest sporo innych, mniej znanych...).
Go to the top of the page
+Quote Post
kaniagandzowski
post
Post #22





Grupa: Zarejestrowani
Postów: 72
Pomógł: 1
Dołączył: 2.06.2006

Ostrzeżenie: (0%)
-----


Dzięki za szybką odpowiedz.

Przeczytałem klika krotnie twój artykuł Elastyczny kontroler (http://ludvik.pl/2007/08/23/elastyczny-kontroler/) i nie do końca rozumiem jak uruchomić to i jak operować tym wzorcem.

Zrozumiałem w ten sposób (tyczy się przykładu kodu umieszczonego na stronie ludvik.pl art. „elastyczny kontroler”)
Klasa RequestContext (interfejs) to do tej klasy w sumie obiekty typu RequestContext ,są wrzucane dane, przekazane przez użytkownika. A obiekt posiada informacje do jakiej metody są przeznaczone te parametry.

interface ResponseContext (Interfejs kontekstu odpowiedzi ) obiekty tego typu zawierają dane wrzucane przez daną akcje (metodę – wyniki ich wykonania z którymi się chcą podzielić z widokami lub akcjami)

interface HttpRequestDispatcher (Interfejs request dispatchera dla protokołu http) – tego nie wiem co robi
oraz
  1. <?php
  2. class HttpFrontController {
  3. /**
  4.  * Uruchamia kontroler.
  5.  */
  6. function run(HttpRequest $req, HttpResponse $res) {
  7. $dispatcher = new BaseHttpRequestDispatcher();
  8. $controller = $dispatcher->getApplicationController($req);
  9. $reqContext = $dispatcher->getRequestContext($req);
  10. $resContext = $dispatcher->getResponseContext();
  11.  
  12. $controller->forward($reqContext->getActionName());
  13.  
  14. while($controller->hasNextCommand()) {
  15. $command = $controller->getNextCommand();
  16. $command->execute($reqContext, $resContext);
  17. }
  18.  
  19. $view = new BaseHttpView($req, $res);
  20. $view->render($controler->getView(), $resContext);
  21. }
  22. ?>

Do metody są wrzucane dwa parametry $reg typu HttpRequest – nigdzie nie ma pokazanej tej klasy ! oraz drugi parametr $res typu HttpResponse jego klasy tez nie widzę!
Tak domyślam że klasa HttpFrontController tworzy swój obiekt z danymi przekazanymi do akcji i dane przeznaczone do widoku. Które później ten obiekt powstały ma wrzucane dane przekazane dla tej akcji parametr.

Szukałem innych przykładów tego wzorca Context Object lecz nie znalazłem dla php.
Go to the top of the page
+Quote Post
Ludvik
post
Post #23





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Klasy HttpRequest i HttpResponse to pseudo-klasy, które zawierają szczegółowe żądanie i odpowiedź związaną z protokołem HTTP. Pierwsza z nich zawiera zmienne GET, POST, ciastka itp. Obiekt odpowiedzi zawiera dane typowe dla odpowiedzi HTTP, czyli nagłówki (w tym ciastka) i treść odpowiedzi. Obiekty kontekstu nie zawierają natomiast danych związanych z protokołem. Obiekty implementujące interfejs request dispatchera mają za zadanie:
  • Wywnioskować na podstawie szczegółowego żądania nazwy akcji i kontrolera aplikacji
  • Przetłumaczyć parametry związane z protokołem (dla HTTP są to GET, POST itp...) na parametry związane z akcją
Na podanych wcześniej przeze mnie stronach drugą z tych ról nazwano fabryką kontekstu. Jak to działa? Powiedzmy, że dostajesz żądanie POST z URL /news/666/comment. W tablicy POST znajdują się dane z formularza komentowania, czyli posiadające klucze autor, mail, strona, tresc. Obiekt HttpRequest będzie posiadał zarówno PATHINFO jak i wszystkie dane przesłane metodą POST. Teraz pałeczkę przejmuje RequestDispatcher dla protokołu Http. Najpierw odczytujemy URL i na podstawie jakiejś mapy/wyrażeń regularnych dopasowujemy go do akcji - w tym przypadku powiedzmy addNewsComment. Z URL możemy też odczytać identyfikator newsa. Zapisujemy go w kontekście żądania z kluczem id. Wybrana przez nas akcja doskonale wie, do czego on się odnosi. Następnie zapisujemy w obiekcie kontekstu dane przesłane POST-em. Klucze będą takie same, bo się nie powtarzają. Teraz w akcji możemy spokojnie odnosić się do obiektu kontekstu, zapominając o implementacji protokołu. Akcji nie obchodzi to, czy żądanie jest wysłane protokołem HTTP, czy jest to żądanie SOAP, AJAX czy inne... Odebraniem komunikatu zajmie się RequestDispatcher, który przetłumaczy go do postaci zrozumiałej dla akcji. Akcje zapiszą rezultaty swojego działania w obiekcie kontekstu odpowiedzi. Uformowaniem odpowiedzi dla konkretnego protokołu zajmie się widok.

Trudno znaleźć przykłady, bo rzadko używa się tego wzorca w PHP. Główną jego zaletą jest zlikwidowanie zależności od protokołu, a programiści PHP rzadko kiedy wykraczają poza HTTP GET i POST... Dla mnie ten wzorzec ma jeszcze jedną zaletę - nieco zwiększa przejrzystość kodu akcji.
Go to the top of the page
+Quote Post

2 Stron V  < 1 2
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 11.01.2026 - 08:45